package com.shengyin.ec.model.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

public interface BaseDao<T> {
	  /** 
     * 使用HQL语句进行分页查询操作 
     * offset 第一条记录的索引 
     * pageSize 每页需要显示的记录数 
     * @return 当前页的所有记录 
     */  
    public List findByPage(final String hql, final int offset, final int pageSize);
    
    
    
    
    /** 
    43.     * 使用HQL语句进行分页查询操作 
    44.     * value 如果HQL有一个参数需要传入，则value就是传入的参数 
    45.     * offset 第一条记录的索引 
    46.     * pageSize 每页需要显示的记录数 
    47.     * @return 当前页的所有记录 
    48.     */  
        public List findByPage(final String hql, final Object value,  final int offset, final int pageSize);
        
        /** 
         * 使用HQL语句进行分页查询操作 
         * values 如果HQL有多个参数需要传入，则values就是传入的参数数组 
        * offset 第一条记录的索引 
       * pageSize 每页需要显示的记录数 
         * @return 当前页的所有记录 
        */  
        public List findByPage(final String hql, final Object[] values,  final int offset, final int pageSize);
	// 根据主键获取实体。如果没有相应的实体，返回 null。
	/*
	 * (non-Javadoc)
	 * 
	 * @see com.shengyin.ec.persistence.dao.BaseDao#get(java.io.Serializable)
	 */
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#get(java.io.Serializable)
	 */
	@SuppressWarnings( { "hiding" })
	public abstract <T> T get(Serializable id);

	// 根据主键获取实体。如果没有相应的实体，抛出异常。
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#load(java.lang.Long)
	 */
	public abstract T load(Long id);

	// 获取全部实体。
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#loadAll()
	 */
	public abstract List<T> loadAll();

	// 根据主键获取实体并加锁。如果没有相应的实体，返回 null。
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#getWithLock(java.lang.Long, org.hibernate.LockMode)
	 */
	public abstract T getWithLock(Long id, LockMode lock);

	// 存储实体到数据库
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#save(T)
	 */
	public abstract void save(T entity);

	// 增加或更新实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#saveOrUpdate(T)
	 */
	public abstract void saveOrUpdate(T entity);

	// 更新实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#update(T)
	 */
	public abstract void update(T entity);

	// 更新实体并加锁
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#updateWithLock(T, org.hibernate.LockMode)
	 */
	public abstract void updateWithLock(T entity, LockMode lock);

	// 增加或更新集合中的全部实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#saveOrUpdateAll(java.util.Collection)
	 */
	public abstract void saveOrUpdateAll(Collection<T> entities);

	// 删除指定的实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#delete(T)
	 */
	public abstract void delete(T entity);

	// 加锁并删除指定的实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#deleteWithLock(T, org.hibernate.LockMode)
	 */
	public abstract void deleteWithLock(T entity, LockMode lock);

	// 根据主键删除指定实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#deleteByKey(java.lang.Long)
	 */
	public abstract void deleteByKey(Long id);

	// 根据主键加锁并删除指定的实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#deleteByKeyWithLock(java.lang.Long, org.hibernate.LockMode)
	 */
	public abstract void deleteByKeyWithLock(Long id, LockMode lock);

	// 删除集合中的全部实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#deleteAll(java.util.Collection)
	 */
	public abstract void deleteAll(Collection<T> entities);

	// 使用HSQL语句直接增加、更新、删除实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#bulkUpdate(java.lang.String)
	 */
	public abstract int bulkUpdate(String queryString);

	// 使用带参数的HSQL语句增加、更新、删除实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#bulkUpdate(java.lang.String, java.lang.Object[])
	 */
	public abstract int bulkUpdate(String queryString, Object[] values);

	// 使用HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#find(java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public abstract List find(String queryString);

	// 使用带参数的HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#find(java.lang.String, java.lang.Object[])
	 */
	@SuppressWarnings("unchecked")
	public abstract List find(String queryString, Object[] values);

	// 使用带命名的参数的HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByNamedParam(java.lang.String, java.lang.String[], java.lang.Object[])
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByNamedParam(String queryString,
			String[] paramNames, Object[] values);

	// 使用命名的HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByNamedQuery(java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByNamedQuery(String queryName);

	// 使用带参数的命名HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByNamedQuery(java.lang.String, java.lang.Object[])
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByNamedQuery(String queryName, Object[] values);

	// 使用带命名参数的命名HSQL语句检索数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByNamedQueryAndNamedParam(java.lang.String, java.lang.String[], java.lang.Object[])
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByNamedQueryAndNamedParam(String queryName,
			String[] paramNames, Object[] values);

	// 使用HSQL语句检索数据，返回 Iterator
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#iterate(java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public abstract Iterator iterate(String queryString);

	// 使用带参数HSQL语句检索数据，返回 Iterator
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#iterate(java.lang.String, java.lang.Object[])
	 */
	@SuppressWarnings("unchecked")
	public abstract Iterator iterate(String queryString, Object[] values);

	// 关闭检索返回的 Iterator
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#closeIterator(java.util.Iterator)
	 */
	@SuppressWarnings("unchecked")
	public abstract void closeIterator(Iterator it);

	// 创建与会话无关的检索标准
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#createDetachedCriteria()
	 */
	public abstract DetachedCriteria createDetachedCriteria();

	// 创建与会话绑定的检索标准
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#createCriteria()
	 */
	public abstract Criteria createCriteria();

	// 检索满足标准的数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByCriteria(org.hibernate.criterion.DetachedCriteria)
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByCriteria(DetachedCriteria criteria);

	// 检索满足标准的数据，返回指定范围的记录
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findByCriteria(org.hibernate.criterion.DetachedCriteria, int, int)
	 */
	@SuppressWarnings("unchecked")
	public abstract List findByCriteria(DetachedCriteria criteria,
			int firstResult, int maxResults);

	// 使用指定的实体及属性检索（满足除主键外属性＝实体值）数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findEqualByEntity(T, java.lang.String[])
	 */
	public abstract List<T> findEqualByEntity(T entity, String[] propertyNames);

	// 使用指定的实体及属性检索（满足属性 like 串实体值）数据
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#findLikeByEntity(T, java.lang.String[])
	 */
	public abstract List<T> findLikeByEntity(T entity, String[] propertyNames);

	// 使用指定的检索标准获取满足标准的记录数
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#getRowCount(org.hibernate.criterion.DetachedCriteria)
	 */
	public abstract Integer getRowCount(DetachedCriteria criteria);

	// 使用指定的检索标准检索数据，返回指定统计值(max,min,avg,sum)
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#getStatValue(org.hibernate.criterion.DetachedCriteria, java.lang.String, java.lang.String)
	 */
	public abstract Object getStatValue(DetachedCriteria criteria,
			String propertyName, String StatName);

	// 加锁指定的实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#lock(T, org.hibernate.LockMode)
	 */
	public abstract void lock(T entity, LockMode lock);

	// 强制初始化指定的实体
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#initialize(java.lang.Object)
	 */
	public abstract void initialize(Object proxy);

	// 强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）
	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#flush()
	 */
	public abstract void flush();

	/* (non-Javadoc)
	 * @see com.shengyin.ec.persistence.dao.dao#getSession()
	 */
	public abstract Session getSession();
	

}